﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using negocios;
using objetos;
using publico;
using System.Transactions;
using System.Text;
using System.Data;
 

namespace softsales.pagina.ordem_producao
{
       

    public partial class ordem_producao_editar : System.Web.UI.Page
    {
        BLL_TB_EMPRESA b_tb_empresa = new BLL_TB_EMPRESA();
        BLL_TB_UNIDADE_MEDIDA b_tb_unidade_medida = new BLL_TB_UNIDADE_MEDIDA();
        BLL_TB_ESTOQUE_LOCAL b_tb_estoque_local = new BLL_TB_ESTOQUE_LOCAL();
        BLL_TB_TIPO_SITUACAO_ORDEM_PRODUCAO b_tb_tipo_situacao_ordem_producao = new BLL_TB_TIPO_SITUACAO_ORDEM_PRODUCAO();
        BLL_TB_CADASTRO b_tb_cadastro = new BLL_TB_CADASTRO();
        OBJ_TB_ORDEM_PRODUCAO o_tb_ordem_producao = new OBJ_TB_ORDEM_PRODUCAO();
        BLL_TB_ORDEM_PRODUCAO b_tb_ordem_producao = new BLL_TB_ORDEM_PRODUCAO();

        BLL_TB_ORDEM_PRODUCAO_ITEM b_tb_ordem_producao_item = new BLL_TB_ORDEM_PRODUCAO_ITEM();
        OBJ_TB_ORDEM_PRODUCAO_ITEM o_tb_ordem_producao_item = new OBJ_TB_ORDEM_PRODUCAO_ITEM();

        BLL_TB_PRODUTO b_tb_produto = new BLL_TB_PRODUTO();
        OBJ_TB_PRODUTO o_tb_produto = new OBJ_TB_PRODUTO();

        OBJ_TB_ESTOQUE_MOVIMENTO o_tb_estoque_movimento = new OBJ_TB_ESTOQUE_MOVIMENTO();
        BLL_TB_ESTOQUE_MOVIMENTO b_tb_estoque_movimento = new BLL_TB_ESTOQUE_MOVIMENTO();


        BLL_TB_ESTOQUE_TIPO_MOVIMENTO b_tb_estoque_tipo_movimento = new BLL_TB_ESTOQUE_TIPO_MOVIMENTO();
        OBJ_TB_ESTOQUE_TIPO_MOVIMENTO o_tb_estoque_tipo_movimento = new OBJ_TB_ESTOQUE_TIPO_MOVIMENTO();

        BLL_TB_LOG_ERRO b_tb_log_erro = new BLL_TB_LOG_ERRO();
        

        protected void Page_Load(object sender, EventArgs e)
        {
            if (PUB_SESSAO.Logado())
            {
                if (!IsPostBack)
                {
                    b_tb_tipo_situacao_ordem_producao.PreencheControle(DDL_ID_SITUACAO_ORDEM_PRODUCAO, true);
                    b_tb_estoque_local.PreencheControle(DDL_ID_ESTOQUE_LOCAL, true);
                    b_tb_empresa.PreencheControleWeb(DDL_ID_EMPRESA, true);
                    b_tb_unidade_medida.PreencheControle(DDL_ID_UNIDADE_MEDIDA, true);

                    if (Request["id"] != null)
                    {

                        Editar(Request["id"].ToString());

                    }

                }
                else
                {

                    if (Session["id_produto"] != null)
                    {
                        int id_produto = Convert.ToInt32(Session["id_produto"].ToString());
                        o_tb_produto = b_tb_produto.SelecionarObjetoPorId(id_produto);
                        TXT_DESC_PROD_ITEM.Text = o_tb_produto.descricao.ToString();
                        TXT_QTD.Text = "1";
                        TXT_VALOR_UNITARIO.Text = PUB_FUNCOES.FormataNumerico(o_tb_produto.valor_venda.ToString());                      
                        Session.Remove("id_produto");
                    }

                }
            }

        }

        private void Editar(String id)
        {
            try
            {
                o_tb_ordem_producao = b_tb_ordem_producao.SelecionarObjetoPorId(Convert.ToInt32(id));

                HF_ID.Value = o_tb_ordem_producao.id.ToString();
                TXT_NUM_ORDEM_PRODUCAO.Text = o_tb_ordem_producao.num_ordem_producao.ToString();
                DDL_ID_EMPRESA.SelectedValue = b_tb_empresa.SelecionarObjetoPorId(o_tb_ordem_producao.id_empresa).nome.ToString();
                TXT_ID_CADASTRO.Text = o_tb_ordem_producao.id_cadastro.ToString();
                TXT_NOME_CADASTRO.Text = b_tb_cadastro.SelecionarObjetoPorId(o_tb_ordem_producao.id_cadastro).nome.ToString();                
                DDL_ID_SITUACAO_ORDEM_PRODUCAO.SelectedValue = o_tb_ordem_producao.id_situacao_ordem_producao.ToString();
                TXT_ID_PRODUTO_SERVICO.Text = o_tb_ordem_producao.id_produto_servico.ToString();
                TXT_ID_PEDIDO.Text = o_tb_ordem_producao.id_pedido.ToString();
                TXT_DESC_PRODUTO_SERVICO.Text = b_tb_produto.SelecionarObjetoPorId(o_tb_ordem_producao.id_produto_servico).descricao.ToString();
                TXT_DT_INICIO_PRODUCAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_inicio_producao.ToString());
                TXT_DT_FINAL_PRODUCAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_final_producao.ToString());
                TXT_QTD_PRODUZIDA.Text = o_tb_ordem_producao.qtd_produzida.ToString();
                TXT_QTD_PRODUZIR.Text = o_tb_ordem_producao.qtd_produzir.ToString();
                TXT_OBSERVACAO.Text = o_tb_ordem_producao.observacao.ToString();
                DDL_ID_UNIDADE_MEDIDA.SelectedValue = o_tb_ordem_producao.id_unidade_medida.ToString();
                TXT_DT_EMISSAO.Text = PUB_FUNCOES.FormataDataBR(o_tb_ordem_producao.dt_emissao.ToString());                 

                DesabilitaControle();
            }
            catch (Exception)
            {

                throw;
            }



        }

        private void DesabilitaControle()
        {
            TXT_NUM_ORDEM_PRODUCAO.Enabled = false;
            DDL_ID_EMPRESA.Enabled = false;
            TXT_ID_CADASTRO.Enabled = false;
            TXT_NOME_CADASTRO.Enabled = false;
            DDL_ID_ESTOQUE_LOCAL.Enabled = false;
            TXT_ID_PRODUTO_SERVICO.Enabled = false;
            TXT_ID_PEDIDO.Enabled = false;
            TXT_DESC_PRODUTO_SERVICO.Enabled = false;
            TXT_DT_INICIO_PRODUCAO.Enabled = false;
            TXT_DT_FINAL_PRODUCAO.Enabled = false;
            TXT_QTD_PRODUZIDA.Enabled = false;
            TXT_QTD_PRODUZIR.Enabled = false;
            TXT_OBSERVACAO.Text = o_tb_ordem_producao.observacao.ToString();
            DDL_ID_UNIDADE_MEDIDA.Enabled = false;
            TXT_DT_EMISSAO.Enabled = false;

        }




        protected void BTN_INCLUIR_ITEM_Click(object sender, EventArgs e)
        {
            try
            {
                
                if (TXT_ID_PROD_ITEM.Text != string.Empty && TXT_QTD.Text != string.Empty)
                {                 
                    int id_ordem_producao = Convert.ToInt32(HF_ID.Value);                                               

                    // ORDEM DE PRODUCAO ITEM
                    o_tb_ordem_producao_item.id_produto_servico = Convert.ToInt32(TXT_ID_PROD_ITEM.Text);                                    
                    o_tb_ordem_producao_item.dt_lancamento = DateTime.Now;
                    o_tb_ordem_producao_item.id_ordem_producao = id_ordem_producao;
                    o_tb_ordem_producao_item.id_usuario = PUB_SESSAO.Id;
                    o_tb_ordem_producao_item.qtd = Convert.ToInt32(PUB_FUNCOES.TrataInteiro(TXT_QTD.Text));
                    o_tb_ordem_producao_item.valor_unitario = Convert.ToDecimal(TXT_VALOR_UNITARIO.Text);
                    o_tb_ordem_producao_item.dt_lancamento = DateTime.Now;

                    b_tb_ordem_producao_item.Incluir(o_tb_ordem_producao_item);

                }
            }
            catch (Exception ex)
            {
                b_tb_log_erro.IncluirLogErro(ex);
                Master.MSG_ALERTA("Erro ao tentar incluir o item na ordem de produção e movimento interno de estoque");
                
            }
         

        }

        protected void BTN_CANCELAR_Click(object sender, EventArgs e)
        {
            Response.Redirect("default.aspx", false);
        }

        protected void BTN_SALVAR_Click(object sender, EventArgs e)
        {
            try
            {

                if (TXT_DT_FINAL_PRODUCAO.Text != string.Empty)
                    o_tb_ordem_producao.dt_final_producao = Convert.ToDateTime(TXT_DT_FINAL_PRODUCAO.Text);

                o_tb_ordem_producao.id_situacao_ordem_producao = Convert.ToInt32(DDL_ID_SITUACAO_ORDEM_PRODUCAO.Text);
                o_tb_ordem_producao.id = Convert.ToInt32(HF_ID.Value);

                // SE A SITUAÇÃO FOI ALTERADO PARA FECHADO 
                // INCLUI A DATA DE FECHAMENTO DA PRODUCAO E FAZ A ENTRADA NO ESTOQUE
             
                List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_estoque_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();

                if (Equals(o_tb_ordem_producao.id_situacao_ordem_producao, (int)PUB_ENUM.TIPO_SITUACAO_ORDEM_PRODUCAO.FECHADO))
                {
                    using (TransactionScope scope = new TransactionScope())
                    {

                      

                        // ALTERA A ORDEM DE PRODUCAO
                        o_tb_ordem_producao.qtd_produzida = Convert.ToInt32(TXT_QTD_PRODUZIR.Text);
                        o_tb_ordem_producao.dt_final_producao = DateTime.Now;
                        b_tb_ordem_producao.Alterar(o_tb_ordem_producao);


                        // FAZ O MOVIMENTO DE ENTRADA
                        o_tb_estoque_movimento.id_empresa = Convert.ToInt32(DDL_ID_EMPRESA.SelectedValue);                    
                        o_tb_estoque_movimento.id_produto = Convert.ToInt32(TXT_ID_PRODUTO_SERVICO.Text);
                        o_tb_estoque_movimento.id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.PRODUCAO;
                        o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                        o_tb_estoque_movimento.qtd_entrada = 0;
                        o_tb_estoque_movimento.qtd_saida = Convert.ToInt32(TXT_QTD_PRODUZIR.Text);
                        o_tb_estoque_movimento.sigla_movimento = lista_estoque_tipo_movimento.Find((sigla) => sigla.id == o_tb_estoque_movimento.id_tipo_movimento).sigla.ToString();
                        o_tb_estoque_movimento.valor_compra = 0;
                        o_tb_estoque_movimento.valor_venda = b_tb_ordem_producao_item.ValorTotal(o_tb_ordem_producao.id);
                        o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
                

                        Master.MSG_ALERTA("Cancelamento realizada com sucesso.", "default.aspx", false);

                        scope.Complete();

                    }


                }

                if (Equals(o_tb_ordem_producao.id_situacao_ordem_producao, (int)PUB_ENUM.TIPO_SITUACAO_ORDEM_PRODUCAO.CANCELADO))
                {
                    List<OBJ_TB_ORDEM_PRODUCAO_ITEM> lista_ordem_producao_item = b_tb_ordem_producao_item.SelecionarLista(string.Format("tb_ordem_producao_item.id_ordem_producao={0}",HF_ID.Value),"");
                    
                    using (TransactionScope scope = new TransactionScope())
                    {


                        foreach (OBJ_TB_ORDEM_PRODUCAO_ITEM obj_tb_ordem_producao_item in lista_ordem_producao_item)
                        {

                            o_tb_estoque_movimento.dt_atualizacao = DateTime.Now;
                            o_tb_estoque_movimento.id_empresa = Convert.ToInt32(DDL_ID_EMPRESA.SelectedValue);                           
                            o_tb_estoque_movimento.id_produto = obj_tb_ordem_producao_item.id_produto_servico;
                            o_tb_estoque_movimento.id_tipo_movimento = (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.PRODUCAO;
                            o_tb_estoque_movimento.id_usuario = PUB_SESSAO.Id;
                            o_tb_estoque_movimento.qtd_entrada = o_tb_ordem_producao_item.qtd;
                            o_tb_estoque_movimento.qtd_saida = 0;
                            o_tb_estoque_movimento.sigla_movimento = lista_estoque_tipo_movimento.Find((sigla) => sigla.id == o_tb_estoque_movimento.id_tipo_movimento).sigla.ToString();
                            o_tb_estoque_movimento.valor_compra = obj_tb_ordem_producao_item.valor_unitario;
                            o_tb_estoque_movimento.valor_venda = 0;

                        }

                        Master.MSG_ALERTA("Cancelamento realizada com sucesso. ", "default.aspx", false);

                        scope.Complete();
                    }
                }

                if (Equals(o_tb_ordem_producao.id_situacao_ordem_producao, (int)PUB_ENUM.TIPO_SITUACAO_ORDEM_PRODUCAO.ABERTO))
                {                                                        
                    b_tb_ordem_producao.Alterar(o_tb_ordem_producao);
                    Master.MSG_ALERTA("Alteração realizada com sucesso.","default.aspx",false);
                }
           
            }
            catch (Exception ex)
            {
                b_tb_log_erro.IncluirLogErro(ex);
                Master.MSG_ALERTA("Erro ao tentar salvar a ordem de produção.");
            }
        }

        public void CarregaGrid()
        {

            try
            {
                StringBuilder sb = new StringBuilder();


                List<string> lista = new List<string>();
         

                sb.Append(string.Join(" and ", lista.ToArray()));

                DataSet ds = new DataSet();


                ds = b_tb_ordem_producao_item.Selecionar(sb.ToString(), PUB_PAGINACAO.Sort, PUB_PAGINACAO.PageIndex, PUB_PAGINACAO.PageSize);

                if (ds.Tables[0].Rows.Count > 0)
                {
                    GRV_TB_ORDEM_PRODUCAO_ITEM.DataSource = ds;
                    GRV_TB_ORDEM_PRODUCAO_ITEM.DataBind();
                    PUB_PAGINACAO.Paginacao(true);
                }
                else
                {
                    GRV_TB_ORDEM_PRODUCAO_ITEM.EmptyDataText = "Nenhum registro foi encontrado";
                    GRV_TB_ORDEM_PRODUCAO_ITEM.DataBind();
                }
            }
            catch (Exception)
            {

                throw;
            }



        }

        protected void GRV_TB_ORDEM_PRODUCAO_ITEM_Sorting(object sender, GridViewSortEventArgs e)
        {

            PUB_PAGINACAO.Sort = e.SortExpression;
            if (PUB_PAGINACAO.SortDirection == SortDirection.Ascending)
            {
                PUB_PAGINACAO.SortDirection = SortDirection.Descending;
                PUB_PAGINACAO.Sort = PUB_PAGINACAO.Sort + " " + PUB_PAGINACAO.DESCENDENTE;
            }
            else
            {
                PUB_PAGINACAO.SortDirection = SortDirection.Ascending;
                PUB_PAGINACAO.Sort = PUB_PAGINACAO.Sort + "  " + PUB_PAGINACAO.ASCENDENTE;
            }

            CarregaGrid();


        }


        protected void GRV_TB_ORDEM_PRODUCAO_ITEM_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GRV_TB_ORDEM_PRODUCAO_ITEM.PageIndex = e.NewPageIndex;
            PUB_PAGINACAO.PageIndex = e.NewPageIndex;
            CarregaGrid();
        }

  
        protected void BTN_CARREGAR_ESTRUTURA_Click(object sender, EventArgs e)
        {
            try
            {
                List<OBJ_TB_PRODUTO> lista_produto = b_tb_produto.SelecionarLista();
                BLL_TB_PRODUTO_ESTRUTURA b_tb_produto_estrutura = new BLL_TB_PRODUTO_ESTRUTURA();

                
                
                int id_ordem_producao = Convert.ToInt32(HF_ID.Value);
                int id_pedido = Convert.ToInt32(PUB_FUNCOES.TrataInteiro(TXT_ID_PEDIDO.Text)) ;
                
                o_tb_ordem_producao = b_tb_ordem_producao.SelecionarObjetoPorId(id_ordem_producao);              
                                        

                List<OBJ_TB_ESTOQUE_TIPO_MOVIMENTO> lista_estoque_tipo_movimento = b_tb_estoque_tipo_movimento.SelecionarLista();

                string sigla = string.Empty;

                foreach (OBJ_TB_PRODUTO_ESTRUTURA o_tb_produto_estrutura in b_tb_produto_estrutura.SelecionarLista(string.Format("tb_produto_estrutura.id_produto_pai = {0}", TXT_ID_PRODUTO_SERVICO.Text), ""))
                {
                    o_tb_ordem_producao_item = new OBJ_TB_ORDEM_PRODUCAO_ITEM();
                    o_tb_ordem_producao_item.dt_lancamento = DateTime.Now;
                    o_tb_ordem_producao_item.id_ordem_producao = Convert.ToInt32(HF_ID.Value);
                    o_tb_ordem_producao_item.id_produto_servico = o_tb_produto_estrutura.id_produto_filho;
                    o_tb_ordem_producao_item.id_usuario = PUB_SESSAO.Id;
                    o_tb_ordem_producao_item.qtd = o_tb_produto_estrutura.qtd;
                    o_tb_ordem_producao_item.valor_unitario = o_tb_produto_estrutura.valor_unitario;
                    b_tb_ordem_producao_item.Incluir(o_tb_ordem_producao_item);

                    sigla = lista_estoque_tipo_movimento.Find((tipo)=>tipo.id == (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.CONSUMOINTERNO ).sigla.ToString();
                    
                    b_tb_estoque_movimento.Incluir(o_tb_ordem_producao.id_empresa, (int)PUB_ENUM.ESTOQUE_TIPO_MOVIMENTO.CONSUMOINTERNO,
                        sigla, o_tb_ordem_producao_item.id_produto_servico, 0, o_tb_ordem_producao_item.qtd, 0, o_tb_ordem_producao_item.valor_unitario, PUB_SESSAO.Id, DateTime.Now);


                }



            }
            catch (Exception)
            {
                
                throw;
            }
        }

        protected void IMG_BTN_EXCLUIR_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                ImageButton btn = (ImageButton)sender;

                int id_ordem_producao = Convert.ToInt32(HF_ID.Value);
                int id_ordem_producao_item = 0;
                if (btn != null)
                {
                    id_ordem_producao_item = Convert.ToInt32(btn.CommandArgument);
                    o_tb_ordem_producao_item = b_tb_ordem_producao_item.SelecionarObjetoPorId(id_ordem_producao_item);
                    b_tb_ordem_producao_item.Excluir(o_tb_ordem_producao_item);

                    GRV_TB_ORDEM_PRODUCAO_ITEM_PREENCHER(id_ordem_producao);
                    
                }

            }
            catch (Exception ex)
            {
                b_tb_log_erro.IncluirLogErro(ex);
                Master.MSG_ALERTA("Erro ao tentar excluir o item da ordem de producao.");
            }
        }


        private void GRV_TB_ORDEM_PRODUCAO_ITEM_PREENCHER(int id_ordem_producao)
        {

            GRV_TB_ORDEM_PRODUCAO_ITEM.DataSource = b_tb_ordem_producao_item.Selecionar(string.Format("id_ordem_producao = {0}", id_ordem_producao), "id");
            GRV_TB_ORDEM_PRODUCAO_ITEM.DataBind();


        }
    }
}